<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var obj = { name: '李煜', age: 30, sex: true, hobby: ['打球', '听音乐'] };
        //var obj2 = obj;//这种写法 无法实现深拷贝, 修改其中一个变量的数据会直接影响到另一个变量的数据

        //循环遍历( 思路: 循环遍历其中一个对象的每个属性, 将对象的每个属性和属性的值添加到另一个对象中 )

        //封装函数( 实现对象的深拷贝 , 返回值是深拷贝之后的对象 )
        function copyObj(obj) {

            //判断obj是否是数组类型, 如果是数组类型, 则obj2被初始化为空数组,否则初始化为空对象
            var obj2 = Array.isArray(obj) ? [] : {};

            for (var key in obj) { //key是属性名, obj[key]是属性值
                if (typeof obj[key] == 'object') { //判断key属性的值是否是引用类型, 如果是, 则需要继续循环遍历处理该属性的值( 递归处理该属性的值 )
                    obj2[key] = copyObj(obj[key])
                } else { //key属性的值不是引用类型, 直接拷贝该属性的值
                    obj2[key] = obj[key];
                }
                // obj2[key] = (typeof obj[key] == 'object' ? copyObj( obj[key] ) :  obj[key])
            }
            return obj2;
        }

        //深拷贝
        var obj2 = copyObj(obj);

        console.log(obj, obj2);
        obj.hobby.push('coding');
        console.log(obj, obj2);

    </script>
</body>

</html>